package com.example.http.code3xx;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;


/**
 * 总结一下：
 * 1.301，302，303，307，都需要重定向功能，如果当前资源访问成功，会根据设置的重定向资源路径访问该资源
 * 做了一个测试，如果访问通过了301，那么重定向到www.baidu.com网站，测试成功了
 * 2.304关于资源缓存，感觉自己的理解和实际的结果有偏差，需要好好了解一下
 */

/**
 * 测试HTTP协议3xx状态码
 * @author zhouxl
 * @DATE 2021/1/21
 * @descriptoin
 */
@Controller
@RequestMapping("api/code/")
public class Code3xx {
    /**
     * 测试状态码301
     * @author zhouxl
     * @date 2021-01-21
     * @param response
     * @return java.lang.String
     */
    @RequestMapping("/code301")
    @ResponseBody
    public void code301(HttpServletResponse response) {
        response.setStatus(301);
        response.setHeader("Location", "http://localhost:8080/api/code/code301_ex");
    }

    @RequestMapping("code301_ex")
    public String code301Ex() {
        return "301";
    }

    /**
     * 测试状态码302
     * @author zhouxl
     * @date 2021-01-21
     * @param response
     * @return java.lang.String
     */
    @RequestMapping("/code302")
    @ResponseBody
    public void code302(HttpServletResponse response) {
        response.setStatus(302);
        response.setHeader("Location", "http://localhost:8080/api/code/code302_ex");
    }

    /**
     * 测试状态码303
     * @author zhouxl
     * @date 2021-01-21
     * @param response
     * @return java.lang.String
     */
    @RequestMapping("/code303")
    @ResponseBody
    public void code303(HttpServletResponse response) {
        response.setStatus(303);
        response.setHeader("Location", "http://localhost:8080/api/code/code303_ex");
//        response.setHeader("Location", "http://www.baidu.com");
    }

    //https://blog.csdn.net/huwei2003/article/details/70139062 - 304状态码介绍网址
    /*
    理一下 关于HTTP协议 304状态码产生的过程
    1.客户端发送一个请求，请求服务器资源
    2.如果当前资源设置 Last Modified，返回给客户端 客户端关于该资源会设置一个 If Modified Since
    3.下一次请求该资源，会带上这个If Modified Since标识，请求服务器，如果该资源最后的修改日期在 If Modified Since之前
       会返回一个304标识信息
    4.这里还有一些理解误差，后面需要好好整理一下
     */

    /**
     * 测试304访问
     * @author zhouxl
     * @date 2021-01-21
     * @param response
     * @return java.lang.String
     */
    @RequestMapping("code304")
    public String code304(HttpServletResponse response) {
        return "3xx/304";
    }

    /**
     * 测试状态码307
     * @author zhouxl
     * @date 2021-01-21
     * @param response
     * @return java.lang.String
     */
    @RequestMapping("/code307")
    @ResponseBody
    public void code307(HttpServletResponse response) {
        response.setStatus(303);
        response.setHeader("Location", "http://localhost:8080/api/code/code307_ex");
//        response.setHeader("Location", "http://www.baidu.com");
    }

}
